package com.sugar.queryinfo.module.business.api.bi.core;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.MD5;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.Method;
import com.sugar.queryinfo.module.business.api.bi.core.dto.ApiReqVO;

import java.util.Objects;

/**
 * @author Y.sugar
 * @since 2025/3/7 16:45
 */
public interface BackInvestBasicApiEnum {

    // 接口请求地址
    String BASE_URL = "https://www.zhichajinkong.com/dataMiddle/api/handle";

    String APP_ID = "07781fa7dbf54b2b";

    String API_SECRET = "b1b6bb758e124530a63ff97127735c6f";

    String API_SECRET_KEY = "f6d225832274ccce218ca4c5eb7e1915";

    String API_SUCCESS_CODE = "200";

    // 接口统一超时时间 3分钟
    int INTERFACE_TIME_OUT = 180000;

    /**
     * 获取实际请求 API 地址
     *
     * @return api地址
     */
    default <T extends ApiReqVO> HttpRequest buildReq(T reqVO) {
        return buildReq(null, reqVO);
    }

    /**
     * 获取实际请求 API 地址
     *
     * @param timeout 超时时间，单位：毫秒
     * @return api地址
     */
    default <T extends ApiReqVO> HttpRequest buildReq(Integer timeout, T reqVO) {
        int timestamp = (int) (System.currentTimeMillis() / 1000L) - 10;

        // 加密请求参数
        reqVO.encrypt();

        // 签名
        String encryptedSecret = SecureUtil.md5(API_SECRET);
        String sign = SecureUtil.md5(encryptedSecret + timestamp);

        return HttpRequest
                // 构建请求路径
                .of(BASE_URL)
                // 设置请求方式
                .method(this.getMethod())
                // 设置 Header
                .header("proId", getApiKey())
                .header("appId", APP_ID)
                .header("timestamp", String.valueOf(timestamp))
                .header("sign", sign)
                // 设置接口超时时间
                .timeout(Objects.isNull(timeout) ? INTERFACE_TIME_OUT : timeout)
                .body(reqVO.toJsonStr());
    }

    /**
     * 获取实际请求 API Key
     *
     * @return api Key
     */
    String getApiKey();

    /**
     * 获取请求方式
     *
     * @return 请求方式
     */
    Method getMethod();
}
